//#include<iostream>
//#include<cstring> 
//using namespace std;
//const int N = 110;
//char a[N][N];
//char ret[N][N];
//int n;
//string s("yizhong");
//int dx[] = {0,0,1,-1,1,1,-1,-1};
//int dy[] = {1,-1,0,0,-1,1,-1,1};
//int m;
//void dfs(int i, int j,int pos, int k)
//{
//	if(pos == 6) 
//	{	
//		for(int z = m - 1; z >= 0; z--)
//		{
//			ret[i][j] = s[z];
//			i -= dx[k], j -= dy[k];
//		}
//		return;
//	}
//	int x = i + dx[k], y = j + dy[k];
//	if(x > n || y > n || x < 1 || y < 1) return;
//	
//	if(a[x][y] != s[pos + 1]) return;
//	
//	dfs(x,y,pos + 1, k);
//}
//int main()
//{
//	cin >> n;
//	m = s.size();
//	memset(ret,'*',sizeof ret);
//	for(int i = 1; i <= n; i++)
//		for(int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//		} 
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			 if(a[i][j] == s[0])
//			 {
//			 	for(int k = 0; k < 8; k++)
//			 	{
//			 		dfs(i, j,0,k); 
//				 }
//			  } 
//			 	
//		} 
//	}
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			cout << ret[i][j];
//		} 
//		cout << endl;
//	}
//	return 0;
//} 
//#include <iostream>
//#include <cstring>
//#include <vector>
//
//using namespace std;
//typedef pair<int, int > PII;
//const int N = 4010, INF = 0x3f3f3f3f;
//vector<PII> edges[N];
//int dist[N];
//bool st[N];
//int n, c;
//int prim()
//{
//	memset(dist, 0x3f, sizeof dist);
//	dist[1] = 0;
//	int ret = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		int t = 0;
//		for (int j = 1; j <= n; j++)
//			if (!st[j] && dist[j] < dist[t])
//				t = j;
//		
//		if (dist[t] == INF) return INF;
//		st[t] = true;
//
//		ret += dist[t];
//
//		for (auto& k : edges[t])
//		{
//			int a = k.first, b = k.second;
//			dist[a] = min(dist[a], b);
//		}
//	}
//	return ret;
//}
//struct node
//{
//	int x, y;
//}a[N];
//int get_long(int a1,int b1, int a2, int b2)
//{
//	int dx = a1 - a2;
//	int dy = b1 - b2;
//	return dx * dx + dy * dy;
//}
//int main()
//{
//	cin >> n >> c;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i].x >> a[i].y;
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		for(int j = i + 1; j <= n; j++)
//		{
//			int w = get_long(a[i].x,a[i].y,a[j].x,a[j].y);
//			if(w < c) continue;
//			edges[i].push_back({j, w});
//			edges[j].push_back({i, w});
//		}
//	}
//	int ret = prim();
//	if (ret == INF) cout << -1 << endl;
//	else cout << ret << endl;
//	return 0;
//}
//#include<iostream>
//#include<cstring> 
//using namespace std;
//const int N = 110;
//char a[N][N];
//char ret[N][N];
//int n;
//string s("yizhong");
//int dx[] = {0,0,1,-1,1,1,-1,-1};
//int dy[] = {1,-1,0,0,-1,1,-1,1};
//int m;
//void dfs(int i, int j,int pos, int k)
//{
//	if(pos == 6) 
//	{	
//		for(int z = m - 1; z >= 0; z--)
//		{
//			ret[i][j] = s[z];
//			i -= dx[k], j -= dy[k];
//		}
//		return;
//	}
//	int x = i + dx[k], y = j + dy[k];
//	if(x > n || y > n || x < 1 || y < 1) return;
//	
//	if(a[x][y] != s[pos + 1]) return;
//	
//	dfs(x,y,pos + 1, k);
//}
//int main()
//{
//	cin >> n;
//	m = s.size();
//	memset(ret,'*',sizeof ret);
//	for(int i = 1; i <= n; i++)
//		for(int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//		} 
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			 if(a[i][j] == s[0])
//			 {
//			 	for(int k = 0; k < 8; k++)
//			 	{
//			 		dfs(i, j,0,k); 
//				 }
//			  } 
//			 	
//		} 
//	}
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			cout << ret[i][j];
//		} 
//		cout << endl;
//	}
//	return 0;
//} 
//#include <iostream>
//#include <cstring>
//#include <vector>
//
//using namespace std;
//typedef pair<int, int > PII;
//const int N = 4010, INF = 0x3f3f3f3f;
//vector<PII> edges[N];
//int dist[N];
//bool st[N];
//int n, c;
//int prim()
//{
//	memset(dist, 0x3f, sizeof dist);
//	dist[1] = 0;
//	int ret = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		int t = 0;
//		for (int j = 1; j <= n; j++)
//			if (!st[j] && dist[j] < dist[t])
//				t = j;
//		
//		if (dist[t] == INF) return INF;
//		st[t] = true;
//
//		ret += dist[t];
//
//		for (auto& k : edges[t])
//		{
//			int a = k.first, b = k.second;
//			dist[a] = min(dist[a], b);
//		}
//	}
//	return ret;
//}
//struct node
//{
//	int x, y;
//}a[N];
//int get_long(int a1,int b1, int a2, int b2)
//{
//	int dx = a1 - a2;
//	int dy = b1 - b2;
//	return dx * dx + dy * dy;
//}
//int main()
//{
//	cin >> n >> c;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i].x >> a[i].y;
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		for(int j = i + 1; j <= n; j++)
//		{
//			int w = get_long(a[i].x,a[i].y,a[j].x,a[j].y);
//			if(w < c) continue;
//			edges[i].push_back({j, w});
//			edges[j].push_back({i, w});
//		}
//	}
//	int ret = prim();
//	if (ret == INF) cout << -1 << endl;
//	else cout << ret << endl;
//	return 0;
//}
//#include<iostream>
//#include<cstring> 
//using namespace std;
//const int N = 110;
//char a[N][N];
//char ret[N][N];
//int n;
//string s("yizhong");
//int dx[] = {0,0,1,-1,1,1,-1,-1};
//int dy[] = {1,-1,0,0,-1,1,-1,1};
//int m;
//void dfs(int i, int j,int pos, int k)
//{
//	if(pos == 6) 
//	{	
//		for(int z = m - 1; z >= 0; z--)
//		{
//			ret[i][j] = s[z];
//			i -= dx[k], j -= dy[k];
//		}
//		return;
//	}
//	int x = i + dx[k], y = j + dy[k];
//	if(x > n || y > n || x < 1 || y < 1) return;
//	
//	if(a[x][y] != s[pos + 1]) return;
//	
//	dfs(x,y,pos + 1, k);
//}
//int main()
//{
//	cin >> n;
//	m = s.size();
//	memset(ret,'*',sizeof ret);
//	for(int i = 1; i <= n; i++)
//		for(int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//		} 
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			 if(a[i][j] == s[0])
//			 {
//			 	for(int k = 0; k < 8; k++)
//			 	{
//			 		dfs(i, j,0,k); 
//				 }
//			  } 
//			 	
//		} 
//	}
//	for(int i = 1; i <= n; i++)
//	{
//		for(int j = 1; j <= n; j++)
//		{
//			cout << ret[i][j];
//		} 
//		cout << endl;
//	}
//	return 0;
//} 
//#include <iostream>
//#include <cstring>
//#include <vector>
//
//using namespace std;
//typedef pair<int, int > PII;
//const int N = 4010, INF = 0x3f3f3f3f;
//vector<PII> edges[N];
//int dist[N];
//bool st[N];
//int n, c;
//int prim()
//{
//	memset(dist, 0x3f, sizeof dist);
//	dist[1] = 0;
//	int ret = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		int t = 0;
//		for (int j = 1; j <= n; j++)
//			if (!st[j] && dist[j] < dist[t])
//				t = j;
//		
//		if (dist[t] == INF) return INF;
//		st[t] = true;
//
//		ret += dist[t];
//
//		for (auto& k : edges[t])
//		{
//			int a = k.first, b = k.second;
//			dist[a] = min(dist[a], b);
//		}
//	}
//	return ret;
//}
//struct node
//{
//	int x, y;
//}a[N];
//int get_long(int a1,int b1, int a2, int b2)
//{
//	int dx = a1 - a2;
//	int dy = b1 - b2;
//	return dx * dx + dy * dy;
//}
//int main()
//{
//	cin >> n >> c;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i].x >> a[i].y;
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		for(int j = i + 1; j <= n; j++)
//		{
//			int w = get_long(a[i].x,a[i].y,a[j].x,a[j].y);
//			if(w < c) continue;
//			edges[i].push_back({j, w});
//			edges[j].push_back({i, w});
//		}
//	}
//	int ret = prim();
//	if (ret == INF) cout << -1 << endl;
//	else cout << ret << endl;
//	return 0;
//}
#include<iostream>
#include<unordered_map>
#include<set>
#include<vector>
using namespace std;

unordered_map<string,int>mp;
set<string>st;
set<string>tmp;
int n,m;
const int N = 1e5 + 10;
string s[N];
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		string s; cin >> s;
		st.insert(s);
	}
	cin >> m;
	for(int i = 1; i <= m; i++)
	{
		cin >> s[i];
		if(st.count(s[i])) tmp.insert(s[i]);
	}
	int ret = m + 1;
	int cnt = tmp.size();
	cout << cnt << endl;
	if(cnt == 0) 
	{
		cout << 0 << endl; 
		return 0;
	}
	for(int l = 1, r = 1, k = 0; r <= m; r++)
	{
		if(!st.count(s[r])) continue;
		mp[s[r]]++;
		if(mp(s[r]) == 1)
			k++;
		while(k == cnt)
		{
			ret = min(ret, r - l + 1);
			if(mp.count(s[l])) mp[s[l]]--;
			if(mp[s[l]] == 0)
			{
				k--;
			} 
			l++; 
		}
	}

	cout << ret << endl;
	return 0;
}




